//命名捕获分组 就是给捕获的分组 取一个名字

console.log(/(?<x>\d{2})-(?<y>\d{2})/.exec('11-22'));
/*
[
  '11-22',
  '11',
  '22',
  index: 0,
  input: '11-22',
  groups: [Object: null prototype] { x: '11', y: '22' }
]
*/
console.log('11-22'.match(/(?<x>\d{2})-(?<y>\d{2})/));
/*
[
  '11-22',
  '11',
  '22',
  index: 0,
  input: '11-22',
  groups: [Object: null prototype] { x: '11', y: '22' }
]
*/
/** \k<name>能引用前面定义的命名分组, 即↓面的例子 如果x分组匹配上的是11, 那么\k<x>也要求匹配上的是11
 * \k<x>并不会单独作为一个捕获分组, 它只是前面已经定义好的分组的引用 */
console.log('11-22'.match(/(?<x>\d{2})-\k<x>/)); //null
console.log('11-11'.match(/(?<x>\d{2})-\k<x>/));
/*
[
  '11-11',
  '11',
  index: 0,
  input: '11-11',
  groups: [Object: null prototype] { x: '11' }
]
*/

// \1 表示引用第一个分组, 这里和 \k<foo>、(?<foo>a)的效果都等价
console.log(/(?<foo>a)\k<foo>\1/.test("aaa")); // true

console.log("abc".replace(/(?<foo>a)/, "$<foo>-")); // "a-bc" //此时 $1 仍然可用(和$<foo>)是等价的
